// function test(exe){
//   var arr= [1,2]
//   exe(function cancel(arr){
//    return 1
//   })
// }
// var arr= [1,2]
// test(function aa (arr) {
//   console.log(arr());
// })
function forEach(obj, fn) {
  if (obj === null || typeof obj === 'undefined') {
    return;
  }
  if (typeof obj !== 'object') {
    obj = [obj];  //不是对象的话，转为数组
  }
  if (Array.isArray(obj)){
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj); //相同作用，绑定一个null，传入剩余的参数
    }
  } else {
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj); //相同作用
      }
    }
  }
}


function merge(/* obj1, obj2, obj3, ... */) {
  var result = {};
  function assignValue(val, key) {
    if (typeof result[key] === 'object' && typeof val === 'object') {
      result[key] = merge(result[key], val); // 递归
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }
  return result;
}
var a = {name: 'zz', option1: {data: '123',isOpen: true}}
var b = {age: 123, option1: {data: '13',isOsn: false}}
console.log(merge(a,b));